package com.zb.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zb.entity.*;
import com.zb.extend.WorkNetworkExtend;
import com.zb.extend.WorkOrderExtend;
import com.zb.mobile.*;
import com.zb.result.PageUtil;
import com.zb.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 工单表 Mapper 接口
 * </p>
 *
 * @author WEN
 * @since 2023-09-20
 */
@Repository
public interface ZjWorkOrderMapper extends BaseMapper<ZjWorkOrder> {

    /**
     * 获取工单列表数据
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    List<Long> getOrderListIdsByPageSearch(@Param("custAccId") Long custAccId, @Param("selectVo") OrderListSelectVo selectVo);

    /**
     * 获取工单列表数据
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    List<WorkOrderExtend> getOrderList(@Param("custAccId") Long custAccId, @Param("selectVo") OrderListSelectVo selectVo);

    /**
     * 获取工单列表数据总记录数
     * @param custAccId 商家ID
     * @param selectVo 搜索条件
     * @return
     */
    long getListCount(@Param("custAccId") Long custAccId, @Param("selectVo") OrderListSelectVo selectVo);


    /**
     * 获取工单归档列表ID数据
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<Long> getOrderArchivedListIdsByPageSearch(@Param("custAccId") Long custAccId, @Param("searchVo") OrderArchivedListSearchVo searchVo);

    /**
     * 获取工单归档列表数据总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getOrderArchivedListCount(@Param("custAccId") Long custAccId, @Param("searchVo") OrderArchivedListSearchVo searchVo);

    /**
     * 根据商家ID获取归档工单的状态（已完成、已取消）数量
     * @param custAccId 商家ID
     * @param  status 状态：4-已完成，5-已取消
     * @return
     */
    long getOrderArchivedOrderStatusQty(@Param("custAccId") Long custAccId, @Param("status") Integer status);


    /**
     * 获取工单列表数据
     * @param ids 工单ID集合
     * @param orderBy 排序
     * @return
     */
    List<WorkOrderExtend> getList(@Param("ids") List<Long> ids, @Param("orderBy") String orderBy);

    /**
     * 获取结算列表状态数量
     * @param custAccId 商家ID
     * @return
     */
    OrderSettlementStatusQtyVo getOrderSettlementStatusQty(@Param("custAccId") Long custAccId);

    /**
     * 获取工单结算列表ID数据
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<Long> getOrderSettlementListIdsByPageSearch(@Param("custAccId") Long custAccId, @Param("searchVo") OrderSettlementListSearchVo searchVo);

    /**
     * 获取工单结算列表ID数据总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getOrderSettlementListCount(@Param("custAccId") Long custAccId, @Param("searchVo") OrderSettlementListSearchVo searchVo);

    /**
     * 获取工单结算列表数据
     * @param ids 工单ID集合
     * @param searchVo 排序条件
     * @return
     */
    List<WorkOrderExtend> getOrderSettlementList(@Param("ids") List<Long> ids, @Param("searchVo") OrderSettlementListSearchVo searchVo);

    /**
     * 根据工单模块ID获取关联工单的模块ID
     * @param moduleIds 工单模块ID集合
     * @return
     */
    List<Long> getRelationModuleIdByModuleIds(@Param("moduleIds") List<Long> moduleIds);

    /**
     * 根据商家ID获取对应状态的工单数量
     * @param custAccId 商家ID
     * @return
     */
    OrderStatusQtyVo getOrderListStatusQty(@Param("custAccId") Long custAccId);

    /**
     * 根据客服ID获取客服处理中的工单数量
     * @param empIds 客服ID
     * @return
     */
    List<EmpOrderCountVo> getEmpOrderCountByEmpIds(@Param("empIds") List<Long> empIds);

    /**
     * 根据客服ID查询最后完成工单的客服ID（根据客服分配策略查询熟客客服ID）
     * @param empIds
     * @return
     */
    List<EmpOrderCountVo> getHistoryOrderLastEmpIdByEmpIds(@Param("empIds") List<Long> empIds);

    /**
     * 根据服务商ID获取所有工单数量
     * @param networkIds 服务商ID
     * @return
     */
    List<QtyVo> getTotalOrderByNetworkIds(@Param("networkIds") List<Long> networkIds);

    /**
     * 根据服务商ID获取所有处理中工单数量
     * @param networkIds 服务商ID
     * @return
     */
    List<QtyVo> getServiceOrderByNetworkIds(@Param("networkIds") List<Long> networkIds);

    /**
     * 获取服务商详情之工单明细列表
     * @param networkId 服务商ID
     * @param pageUtil
     * @return
     */
    List<ZjWorkOrder> getNetworkDetailOrderList(@Param("networkId") Long networkId, @Param("pageUtil") PageUtil pageUtil);

    /**
     * 获取服务商详情之工单明细列表
     * @param networkId 服务商ID
     * @return
     */
    long getNetworkDetailOrderListCount(@Param("networkId") Long networkId);

    /**
     * 根据工单ID获取关联的服务商
     * @param workIds 工单ID
     * @return
     */
    List<WorkNetworkExtend> getNetworkByWorkIds(@Param("workIds") List<Long> workIds);

    /**
     * 根据移动端报单工单列表关键词搜索
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param selectVo 搜索条件
     * @return
     */
    List<Long> getWorkIdByUserMobileSearch(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("selectVo") UserOrderSelectVo selectVo);

    /**
     * 获取客户报单端工单列表
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param workIds 工单ID
     * @param selectVo 搜索条件
     * @return
     */
    List<WorkOrderExtend> getUserOrderList(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("workIds") List<Long> workIds, @Param("selectVo") UserOrderSelectVo selectVo);

    /**
     * 获取客户报单端工单列表总记录数
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param workIds 工单ID
     * @param selectVo 搜索条件
     * @return
     */
    long getUserOrderListCount(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("workIds") List<Long> workIds, @Param("selectVo") UserOrderSelectVo selectVo);

    /**
     * 获取移动端的历史工单
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param ids 工单ID
     * @param selectVo 分页
     * @return
     */
    List<ZjWorkOrder> getUserMobileHistoryOrder(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("ids") List<Long> ids, @Param("selectVo") SelectVo selectVo);

    /**
     * 获取移动端的历史工单总记录数
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param ids 工单ID
     * @return
     */
    long getUserMobileHistoryOrderCount(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("ids") List<Long> ids);


    /**
     * 获取服务商移动端工单报表(工单分析)
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 服务商人员ID
     * @param manager 是否管理或负责人：false-不是，true-是
     */
    List<DateQtyVo> getNetworkMobileWeekCreateOrderStat(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("manager") boolean manager);

    /**
     * 获取服务商移动端工单报表(工单分析)
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 服务商人员ID
     * @param manager 是否管理或负责人：false-不是，true-是
     */
    List<DateQtyVo> getNetworkMobileWeekEndOrderStat(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("manager") boolean manager);

    /**
     * 获取工单报表(工单类型占比)
     * @param networkId 服务商ID
     * @param selectVo 搜索条件对象
     * @return
     */
    List<QtyVo> getNetworkOrderModuleStat(@Param("networkId") Long networkId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务人员移动端创建工单统计数量
     * @param networkId 服务商ID
     * @param selectVo 搜索条件
     * @return
     */
    List<DateQtyVo> getNetworkMobileCreateOrderStat(@Param("networkId") Long networkId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务人员移动端工单结单统计数量
     * @param networkId 服务商ID
     * @param selectVo 搜索条件
     * @return
     */
    List<DateQtyVo> getNetworkMobileFinishOrderStat(@Param("networkId") Long networkId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取排行榜数据
     * @param networkId 服务商ID
     * @param selectVo 搜索条件
     * @return
     */
    List<QtyVo> getNetworkFinishOrderScoreStat(@Param("networkId") Long networkId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务商移动端消息工单列表
     * @param networkId 服务商ID
     * @param networkEmpId 工程师ID
     * @param selectVo 搜索条件
     * @return
     */
    List<WorkOrderExtend> getNetworkMobileOrderMessageList(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("selectVo") NetworkMobileOrderMessageListSelectVo selectVo);

    /**
     * 获取服务商移动端消息工单列表总记录数
     * @param networkId 服务商ID
     * @param networkEmpId 工程师ID
     * @param selectVo 搜索条件
     * @return
     */
    long getNetworkMobileOrderMessageListCount(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("selectVo") NetworkMobileOrderMessageListSelectVo selectVo);

    /**
     * 根据服务商ID&服务商人员ID获取服务人员的工单数量
     * @param networkId 服务商ID
     * @param networkEmpIds 服务商人员ID
     * @return
     */
    List<QtyVo> getNetworkEmpOrderQtyByNetworkAndNetworkEmpIds(@Param("networkId") Long networkId, @Param("networkEmpIds") List<Long> networkEmpIds);

    /**
     * 根据服务商搜索条件获取工单ID
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @param keyword 搜索关键词：工单单号/一物一码/产品名称/产品型号
     * @return
     */
    List<Long> getWorkIdByNetworkOrderMobileSearch(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("keyword") String keyword);

    /**
     * 根据工单ID获取工单导出字段
     * @param ids 工单ID
     * @param orderBy 排序
     * @return
     */
    List<WorkOrderExtend> getOrderExportFieldByIds(@Param("ids") List<Long> ids, @Param("orderBy") String orderBy);

    /**
     * 根据[服务商ID] & [服务人员ID]获取今日完成工单量
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @return
     */
    long getTodayFinishOrderQty(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId);

    /**
     * 查询服务商移动端总工单数量
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 工程师ID
     * @param selectVo 搜索对象
     * @return
     */
    long getNetworkMobileTotalOrderQty(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务商移动端完成工单数量
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 工程师ID
     * @param selectVo 搜索对象
     * @return
     */
    long getNetworkMobileFinishOrderQty(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("selectVo") NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务商近七天(含今天)的工单数
     * @param custAccId 商家ID
     * @param networkId 服务商ID
     * @param networkEmpId 服务商人员ID
     * @return
     */
    List<DateQtyVo> getNetworkInSevenDaysOrder(@Param("custAccId") Long custAccId, @Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId);

    /**
     * 获取待审核的工单事件
     * @param workId 工单ID
     * @return
     */
    List<WorkWaitCheckOrderEvent> getWaitCheckOrderEventByWorkId(@Param("workId") Long workId);

    /**
     * 获取商家详情之工单列表
     * @param factoryId 品牌商家ID
     * @param pageUtil 分页对象
     * @return
     */
    List<WorkOrderExtend> getFactoryDetailOrderList(@Param("factoryId") Long factoryId, @Param("pageUtil") PageUtil pageUtil);

    /**
     * 获取商家详情之工单列表总记录数
     * @param factoryId 品牌商家ID
     * @return
     */
    long getFactoryDetailOrderListCount(@Param("factoryId") Long factoryId);

    /**
     * 根据工单ID获取工单所有费用(含：结算、工单服务费、工单配件费)
     * @param ids 工单ID
     * @return
     */
    List<ZjWorkOrder> getFactoryAllFeeById(@Param("ids") List<Long> ids);

    /**
     * 查询重复工单并返回工单ID
     * @param custAccId 商家ID
     * @param search 重复工单查询条件
     * @return
     */
    List<Long> getWorkRepeat(@Param("custAccId") Long custAccId, @Param("search") WorkRepeatSearchVo search);

    /**
     * 获取服务商移动端工单记录
     * @param networkId 服务商ID
     * @param networkEmpId 服务商人员ID
     * @param search 搜索条件
     * @return
     */
    List<ZjWorkOrder> getMobileWithdrawOrderRecord(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("search") NetworkOrderRecordSearchVo search);

    /**
     * 获取服务商移动端工单记录总记录数
     * @param networkId 服务商ID
     * @param networkEmpId 服务商人员ID
     * @param search
     * @return
     */
    long getMobileWithdrawOrderRecordCount(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("search") NetworkOrderRecordSearchVo search);

    /**
     * 根据工单ID获取服务商的所有费用
     * @param workIds 工单ID
     * @return
     */
    List<QtyVo> getNetworkTotalFee(@Param("workIds") List<Long> workIds);

    /**
     * 根据工单ID获取服务商的所有费用
     * @param workId 工单ID
     * @return
     */
    QtyVo getNetworkTotalFeeById(@Param("workId") Long workId);

    /**
     * 获取工单记录详情
     * @param workId 工单ID
     * @return
     */
    ZjWorkOrder getWithdrawOrderRecordDetail(@Param("workId") Long workId);

    /**
     * 可提现工单列表
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @param search 搜索对象
     * @return
     */
    List<WorkOrderExtend> getWithdrawOrderList(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("search") NetworkOrderRecordSearchVo search);

    /**
     * 可提现工单列表总记录数
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @param search 搜索对象
     * @return
     */
    long getWithdrawOrderListCount(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId, @Param("search") NetworkOrderRecordSearchVo search);

    /**
     * 根据服务商ID & 服务人员ID获取可提现金额
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @return
     */
    List<ZjWorkOrder> getNetworkWithdrawMoney(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId);

    /**
     * 根据服务商ID & 服务人员ID获取冻结金额
     * @param networkId 服务商ID
     * @param networkEmpId 服务人员ID
     * @return
     */
    List<ZjWorkOrder> getNetworkFreezeMoney(@Param("networkId") Long networkId, @Param("networkEmpId") Long networkEmpId);

    /**
     * 查询工单单号是否重复
     * @param custAccId 商家ID
     * @param workNo 工单单号
     * @return
     */
    Integer existCodeByCustAccId(@Param("custAccId") Long custAccId, @Param("workNo") String workNo);

    Integer QualityAccId(@Param("custAccId") Long custAccId);

    void editOrderInfo(@Param("content") String content, @Param("id") Long id);

    void editUserInfo(@Param("orderVo") OrderVo orderVo);

    void setOrderPause(@Param("isPause") Integer isPause, @Param("id") Long id);

    void insertOrderArgInfo(ZjWorkOrderArgCopy zjWorkOrderArgCopy);

    ZjWorkOrderArgCopy getOrderArgInfo(@Param("orderId") Long orderId);

    Long getIsPauseNbr();
    Long getIsHsNbr();

    Long getIsHxNbr();
}
